package com.wanganui.douyin.properties;

import com.dtflys.forest.callback.AddressSource;
import com.dtflys.forest.callback.RetryWhen;
import com.dtflys.forest.callback.SuccessWhen;
import com.dtflys.forest.http.ForestAsyncMode;
import com.dtflys.forest.interceptor.Interceptor;
import com.dtflys.forest.logging.DefaultLogHandler;
import com.dtflys.forest.logging.ForestLogHandler;
import com.dtflys.forest.retryer.BackOffRetryer;
import com.dtflys.forest.springboot.properties.ForestConvertProperties;
import com.dtflys.forest.springboot.properties.ForestSSLKeyStoreProperties;
import com.dtflys.forest.ssl.SSLUtils;
import lombok.Getter;
import lombok.Setter;

import java.time.Duration;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 抖音Forest客户端配置
 *
 * @author xtwang
 * @date 2025/3/14 下午14:03
 **/
@Setter
@Getter
public class DyForestConfigurationProperties {

    // Spring bean id 的 forest 配置
    private String beanId;

    // 允许的最大连接数
    private int maxConnections = 500;

    // 每个路由允许的最大连接数
    private int maxRouteConnections = 500;

    // 请求队列的最大数量
    private int maxRequestQueueSize = 200;

    // 异步请求线程的最大数量
    private int maxAsyncThreadSize = 200;

    // 异步请求队列的容量
    private int maxAsyncQueueSize = 100;

    // 异步请求的并行模式
    private ForestAsyncMode asyncMode = ForestAsyncMode.PLATFORM;

    // 超时时间（毫秒）
    private int timeout = 3000;

    // 连接超时时间（毫秒）
    private Integer connectTimeout = null;

    // 读取超时时间（毫秒）
    private Integer readTimeout = null;

    // 请求字符集
    private String charset = "UTF-8";


    // 全局默认的HTTP方案
    // <p>可以是：
    // <ul>
    //     <li>http</li>
    //     <li>https</li>
    // </ul>
    private String baseAddressScheme;

    // 全局默认主机
    private String baseAddressHost;

    // 全局默认端口
    private Integer baseAddressPort;

    // 全局默认地址的来源
    private Class<? extends AddressSource> baseAddressSource;

    // 重试器的类
    private Class retryer = BackOffRetryer.class;

    // 最大重试次数
    private Integer maxRetryCount = 0;

    // 重试请求的最大间隔时间
    private long maxRetryInterval = 0;

    // 启用自动重定向
    private boolean autoRedirection = true;

    // 启用请求/响应的日志打印
    private boolean logEnabled = true;

    // 启用请求日志打印
    private boolean logRequest = true;

    // 启用响应状态日志打印
    private boolean logResponseStatus = true;

    // 启用响应内容日志打印
    private boolean logResponseContent = false;

    // 日志处理器的类
    private Class<? extends ForestLogHandler> logHandler = DefaultLogHandler.class;

    // HTTPS请求的默认SSL协议
    private String sslProtocol = SSLUtils.TLS_1_2;

    // forest的后端HTTP框架，可以选择以下后端：
    // <ul>
    //     <li>httpclient</li>
    //     <li>okhttp3</li>
    // </ul>
    private String backend = "okhttp3";

    // 后端客户端缓存的最大大小
    private Integer backendClientCacheMaxSize = 128;

    // 后端客户端缓存的过期时间
    private Duration backendClientCacheExpireTime;

    // 全局变量
    private Map<String, Object> variables = new HashMap<>();

    // 拦截器类列表
    private List<Class<? extends Interceptor>> interceptors = new ArrayList<>();

    // 成功时的回调函数：用于判断请求是否成功
    private Class<? extends SuccessWhen> successWhen;

    // 重试时的回调函数：用于确定是否触发重试请求
    private Class<? extends RetryWhen> retryWhen;

    // SSL密钥存储
    private List<ForestSSLKeyStoreProperties> sslKeyStores = new ArrayList<>();

    private ForestConvertProperties converters = new ForestConvertProperties();

    private Map<String, Class> filters = new HashMap<>();

}